#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include "modules/video.h"
#include "modules/camera.h"
#include "modules/download.h"
#include "modules/ota.h"
#include "modules/protocol.h"
#include "utils/log.h"
#include "utils/config.h"
#include "utils/error.h"

// 全局运行标志
static volatile int g_running = 1;

// 信号处理函数
static void sig_handler(int sig)
{
    LOG_INFO("收到信号 %d，准备退出...", sig);
    g_running = 0;
}

// 模块初始化函数
static int modules_init(void)
{
    int ret = 0;
    
    // 初始化配置
    if ((ret = config_init()) != 0) {
        LOG_ERROR("配置初始化失败: %d", ret);
        return ret;
    }
    
    // 初始化视频模块
    if ((ret = video_init()) != 0) {
        LOG_ERROR("视频模块初始化失败: %d", ret);
        return ret;
    }
    
    // 初始化相机模块
    if ((ret = camera_init()) != 0) {
        LOG_ERROR("相机模块初始化失败: %d", ret);
        return ret;
    }
    
    // 初始化下载模块
    if ((ret = download_init()) != 0) {
        LOG_ERROR("下载模块初始化失败: %d", ret);
        return ret;
    }
    
    // 初始化OTA模块
    if ((ret = ota_init()) != 0) {
        LOG_ERROR("OTA模块初始化失败: %d", ret);
        return ret;
    }
    
    // 初始化协议解析模块
    if ((ret = protocol_init()) != 0) {
        LOG_ERROR("协议解析模块初始化失败: %d", ret);
        return ret;
    }
    
    return 0;
}

// 模块清理函数
static void modules_cleanup(void)
{
    protocol_cleanup();
    ota_cleanup();
    download_cleanup();
    camera_cleanup();
    video_cleanup();
    config_cleanup();
}

int main(int argc, char *argv[])
{
    (void)argc;  // 消除未使用参数警告
    (void)argv;  // 消除未使用参数警告
    pthread_t protocol_thread, ota_thread;
    int ret = 0;
    
    // 初始化日志系统
    log_init();
    LOG_INFO("无人机控制系统启动");
    
    // 设置信号处理
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    
    // 初始化所有模块
    if ((ret = modules_init()) != 0) {
        LOG_ERROR("模块初始化失败，退出程序");
        log_cleanup();
        return ret;
    }
    
    // 创建协议处理线程
    if (pthread_create(&protocol_thread, NULL, protocol_thread_func, NULL) != 0) {
        LOG_ERROR("创建协议线程失败");
        ret = -1;
        goto cleanup;
    }
    
    // 创建OTA处理线程
    if (pthread_create(&ota_thread, NULL, ota_thread_func, NULL) != 0) {
        LOG_ERROR("创建OTA线程失败");
        ret = -1;
        goto cleanup;
    }
    
    // 主循环
    LOG_INFO("系统正常运行中...");
    while (g_running) {
        // 这里可以添加主循环需要做的事情
        usleep(100000); // 100ms
    }
    
cleanup:
    // 等待线程结束
    if (pthread_join(protocol_thread, NULL) != 0) {
        LOG_ERROR("等待协议线程结束失败");
    }
    if (pthread_join(ota_thread, NULL) != 0) {
        LOG_ERROR("等待OTA线程结束失败");
    }
    
    // 清理模块资源
    modules_cleanup();
    
    LOG_INFO("程序正常退出");
    log_cleanup();
    
    return ret;
}